/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __79EF3299_DEA4_4b62_B4D0_E5601ECCB581__
#define __79EF3299_DEA4_4b62_B4D0_E5601ECCB581__

namespace xos_container
{
    class i_container;
}

namespace xos_aio
{
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // i_connect : 调用者的用户数据需要实现这个接口，这样在accept到新连接时，aio就可以通过这个接口创建用户端连接了
    // 

    class i_connect
    {
    protected:
        virtual ~i_connect(){}

    public:
        virtual i_connect * create_accept_connect() = 0;
    };

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // i_aio interface
    // 

    class i_aio : public xos::i_release
    {
    public:
        enum enumAioType
        {
            AIO_NONE,

            AIO_TCP_INIT_RET,
            AIO_TCP_INIT,
            AIO_TCP_ACCPET_RET,
            AIO_TCP_ACCPET,
            AIO_TCP_CONNECT_RET,
            AIO_TCP_CONNECT,
            AIO_TCP_RECV_RET,
            AIO_TCP_RECV,
            AIO_TCP_SEND_RET,
            AIO_TCP_SEND,
            AIO_TCP_SHUTDOWN_RET,
            AIO_TCP_SHUTDOWN,
            AIO_TCP_CLOSE_RET,
            AIO_TCP_CLOSE,

            AIO_UDP_INIT_RET,
            AIO_UDP_INIT,
            AIO_UDP_RECV_RET,
            AIO_UDP_RECV,
            AIO_UDP_SEND_RET,
            AIO_UDP_SEND,
            AIO_UDP_SHUTDOWN_RET,
            AIO_UDP_SHUTDOWN,
            AIO_UDP_CLOSE_RET,
            AIO_UDP_CLOSE
        };

    protected:
        virtual ~i_aio(){}

    public:
        // 
        // set callback. 
        // 
        virtual int set_callback( xos::f_runnable pCallback ) = 0;
        //
        // 参数pMsg 说明(不同命令会使用其中的不同数据):
        // 
        // m_bData[0] : true or false for opt result
        // m_bData[1] : true or false for server
        // 
        // m_nMsg[0]  : aio cmd type
        // 
        // m_nData[1] : local port
        // m_szStr[1] : local ip
        // m_nData[2] : peer port
        // m_szStr[2] : peer ip
        // 
        // m_nData[0] : send/recv bytes
        // m_lpBuf[0] : send/recv buf
        // 
        // m_lpData[0] : UserKey
        // m_lpData[1] : AioKey
        // 
        virtual int post_request( xos_box::i_msg *& pMsg ) = 0;
    };

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // i_aio_mgr
    // 
    class i_aio_mgr : public xos::i_release
    {
    protected:
        virtual ~i_aio_mgr(){}

    public:
        // 
        // 设置最大投递的accept,recv,send数量。
        // 0表示默认
        // 只在windows下有效，其它平台下无用
        // 
        virtual int set_tcp_max_post_num( int nMaxPostAcceptNum, int nMaxPostRecvNum, int nMaxPostSendNum ) = 0;
        virtual int set_udp_max_post_num( int nMaxPostRecvNum, int nMaxPostSendNum ) = 0;
        // 
        // set callback thread. all aios use ONE callback thread.
        // 
        virtual int set_callback_thread( xos_box::i_callback * pCallbackThread ) = 0;
        // 
        // set msg type
        // 
        virtual int set_msg_type( int nMsgType ) = 0;
        // 
        // create aio
        // 
        virtual i_aio * aio() = 0;
    };

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // export function
    // 
    typedef int ( * f_create )( xos_container::i_container * pContainer, i_aio_mgr ** ppv );


} // xos_aio

#endif // __79EF3299_DEA4_4b62_B4D0_E5601ECCB581__
